資料是應用系統中最重要的有價值資產,也是系統的大本營,戍衛大本營更是近衛隊重要的資訊安全任務,這一天我們先從京城開始巡查,首先我們需要對於資料庫中某些敏感性欄位作保護。
在PCI DSS的要求3:保護持卡人資料中提到
如非必要,不要儲存持卡人相關敏感資料。若確有儲存的需求,須以加密、截斷、遮罩或雜湊等方式處理。
比方像是下表中的PAN
(Primary account number),也就是信用卡或簽帳卡卡號。
根據PCI DSS的標準不適合直接明碼儲存。
儲存安全保護機制就是希望資訊安全事件災害發時生時,雖然入侵者繞過安全控制獲得某個內含敏感性資料的資料表(Table),我們也還能拿著點38手槍多拖延一點時間。
常見的作法就是將資料行,也就是欄位作雜湊(Hash
)或是加密(encrypt
):
那麼怎麼在SQL資料庫中儲存加密或是雜湊後的資料?
記得以前我們會透過AP的手段,從AP將資料加密/雜湊後再送到DB存放,今天來複習SQL資料庫端的雜湊(Hash
)功能。
先淺淺的認識一下hash function
,雜湊演算法是一種從資料中建立一個唯一性指紋,而且除非有mapping table,hash後的結果通常沒辦法回推回原始資料值。
因為工作上的使用主要還是以微軟SQL Server為主,有Demo的部分會以SQL Server為主,
這邊我們假定成員已經安裝好SQL Server資料庫及管理工具SSMS了。
https://www.microsoft.com/zh-tw/server-cloud/products/sql-server-editions/sql-server-express.aspx
先查看Demo資訊庫的版本資訊:
為了方便接下來的練習,
我們先新增一個資料庫SecurityDB。
CREATE DATABASE [SecurityDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'SecurityDB', FILENAME = N'F:\DATA\SecurityDB.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'SecurityDB_log', FILENAME = N'F:\LOG\SecurityDB_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
建立一個持卡人資料表
USE SecurityDB
CREATE TABLE [dbo].[cardholder](
[id] [int] identity(1,1) NOT NULL,
[pan] [varbinary](max) NOT NULL,
[name] [nvarchar](50) NOT NULL,
[svc] [varchar](3) NOT NULL,
[expirdate] [varchar](4) NULL,
CONSTRAINT [PK_cardholder] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO cardholder
VALUES(HASHBYTES('SHA2_512',N'2123456789012345'),N'亞歷山大','101','1299'),
(HASHBYTES('SHA2_512',N'3123456789012345'),N'凱撒','101','1299')
GO
實現不可讀,而且選擇SHA2還是比較高強度的雜湊演算法
SELECT * FROM cardholder
可以直接將條件雜湊後去比對
SELECT * FROM cardholder
WHERE PAN = HASHBYTES('SHA2_512',N'3123456789012345')
在電腦科學中,資料的編碼encoding是這門學科的數學基礎,密碼學cryptology則從複雜性來創造編碼的應用。
對我們一般凡人來說,編碼也許像密碼學一樣深。
對熟悉密碼學的高手,簡單的密碼學也許像編碼一樣淺。
我們來慢慢熟悉密碼學吧!
不需要金鑰的加密技術稱為雜湊,希望從資料取出唯一的指紋。
需要金鑰的加密技術則稱為加密演算法。
雜湊演算法必須具備不可逆性,舉例來說: y = hash(x) , y不應該算回x
加密演算法則可以透過解密取出原始資料x,舉例來說 y = Encrypt(key,x) ; x = Decrypt(key,y)
了解要保護的標的物才能對症下藥,實施適當的措施,也許可以在工程師的資料字典(Data Dictionary
)中註記是否為個資,如果設計資料表都要參考資料字典,很快就可以盤點出來;再不然,工程師的table schame的column上也可以加上一欄是否為個資。
SQL Server支援的雜湊演算法
https://msdn.microsoft.com/zh-tw/library/ms174415.aspx
巴伐利亞警車
攝於2015-12 rothenburg,Germany